<?php


namespace App\Kuafu\Common\Service;


use App\Kuafu\Invoice\Enum\InvoiceCodeEnum;
use App\Kuafu\Invoice\Exceptions\InvoiceException;

class EncryptService
{

    const KEY = 'kuafu0717';

    /**
     * 加密订单号 [如果需要在 url 中使用,需要 urlEncode]
     * @param string $orderId
     * @return false|string|string[]
     */
    public static function encryptOrderId(string $orderId)
    {
        return self::encrypt($orderId, "E", self::KEY);
    }

    /**
     * 解密订单号
     * @param string $orderId
     * @return false|string|string[]
     */
    public static function decryptOrderId(string $orderId)
    {
        return self::encrypt($orderId, "D", self::KEY);
    }

    /**
     * @param string $string 需要加密解密的字符串
     * @param string $operation 判断是加密还是解密:E:加密  D:解密
     * @param string $key 加密的钥匙(密匙)
     * @return false|string|string[]
     */
    public static function encrypt($string, $operation, $key = '')
    {
        try {
            $key           = md5($key);
            $key_length    = strlen($key);
            $string        = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
            $string_length = strlen($string);
            $rndkey        = $box = array();
            $result        = '';
            for ($i = 0; $i <= 255; $i++) {
                $rndkey[$i] = ord($key[$i % $key_length]);
                $box[$i]    = $i;
            }
            for ($j = $i = 0; $i < 256; $i++) {
                $j       = ($j + $box[$i] + $rndkey[$i]) % 256;
                $tmp     = $box[$i];
                $box[$i] = $box[$j];
                $box[$j] = $tmp;
            }
            for ($a = $j = $i = 0; $i < $string_length; $i++) {
                $a       = ($a + 1) % 256;
                $j       = ($j + $box[$a]) % 256;
                $tmp     = $box[$a];
                $box[$a] = $box[$j];
                $box[$j] = $tmp;
                $result  .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
            }
            if ($operation == 'D') {
                if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
                    return substr($result, 8);
                } else {
                    return '';
                }
            } else {
                return str_replace('=', '', base64_encode($result));
            }
        } catch (\Exception $exception) {
            throw new InvoiceException(InvoiceCodeEnum::ERR_ENCRYPT);
        }

    }

}